#ifndef TEXELS_H_
#define TEXELS_H_

#define BYTES_POR_TEXEL 3

#include <vector>
#include <stdexcept>

class Texels {
   private:
      int ancho_;
      int alto_;

      std::vector<unsigned char> &texels_;

      Texels(const Texels &aCopiar);
      Texels& operator=(const Texels &aCopiar);

   public:
      /*
       * El vector texels sera apropiado por esta instancia, 
       * destruyendolo cuando la instancia de Texels sea destruida
       *
       * Precondicion:
       *    ancho > 0
       *    alto > 0
       *    texels.size() == ancho * alto * BYTES_POR_TEXEL
       *
       * */
      Texels(int ancho, int alto, std::vector<unsigned char> &texels);

      inline int bytesPorTexel() const { return BYTES_POR_TEXEL; }

      inline int ancho() const { return ancho_; }
      inline int alto() const { return alto_; }

      /*
       * Reescala los texels utilizando una interpolacion lineal.
       * Permite ampliar o comprimir la imagen segun dos factores que
       * escalan sobre el ancho y sobre el alto de la imagen.
       *
       * Si la operacion falla, una excepcion es lanzada.
       *
       * Precondicion:
       *    escaladoAncho > 0
       *    escaladoAlto > 0
       * */
      void escalado(float escaladoAncho, float escaladoAlto);

      class EscaladoExcepcion : public std::runtime_error {
         public:
            EscaladoExcepcion() throw();
            virtual ~EscaladoExcepcion() throw();
      };

      inline const std::vector<unsigned char>& texels() const { return texels_; }
      inline const unsigned char* texelsComoArray() const { return &texels_[0]; }

      ~Texels();
};

#undef BYTES_POR_TEXEL

#endif
